package edu.uoc.tds.server;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JOptionPane;

import edu.uoc.tds.bean.*;
import edu.uoc.tds.common.*;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class GestorUsuario {

    private Connection conn = null;
    private UtilLenguaje txt = null;
    private SimpleDateFormat sD = new SimpleDateFormat("dd/MM/yyyy");

    public GestorUsuario(Connection conn) {
        this.conn = conn;
    }

    public Usuario getUsuarioLogin(String codigo, String contrasena) throws Exception {

        Usuario usuario = null;
        ResultSet rs = null;
        PreparedStatement ps = null;

        try {
            String sSQL = "SELECT codigo, nombre, apellidos, sexo, fecha_nacimiento, fecha_alta, "
                    + " id_centro, contrasena, id_documento_identificacion, id_contacto, "
                    + " estado, perfil ";
            sSQL += " FROM usuario ";
            sSQL += " where codigo = ? ";
            sSQL += " and contrasena =? ";
            sSQL += " and estado =? ";

            ps = getConnection().prepareStatement(sSQL);

            ps.setString(1, codigo);
            ps.setString(2, contrasena);
            ps.setInt(3, Variables.estadoActivo);

            rs = ps.executeQuery();

            while (rs.next()) {
                String nombre = rs.getString("nombre");
                String apellidos = rs.getString("apellidos");
                Integer idCentro = new Integer(rs.getInt("id_centro"));
                Integer perfil = new Integer(rs.getInt("perfil"));

                GestorCentroDocente gS = new GestorCentroDocente(getConnection());
                CentroDocente centro = gS.getCentroDocente(idCentro);
                usuario = new Usuario(codigo, nombre, apellidos, centro, contrasena, perfil);

            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.evento.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.evento"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.evento.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.evento"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return usuario;
    }

    public Connection getConnection() {
        return conn;
    }

    public List<Usuario> listaConsultaUsuarios(Integer idUniversidad, Integer idCentro, String nombre,
            String apellidos, Integer estado, Integer perfil, String desde, String hasta,
            Integer tipoDoc, String numDoc) throws Exception {
        List<Usuario> vV = new ArrayList();
        ResultSet rs = null;
        PreparedStatement ps = null;

        try {

            String sSQL = "SELECT  u.codigo FROM usuario AS u "
                    + " LEFT OUTER JOIN CENTRODOCENTE AS c  ON c.id_centro = u.id_centro"
                    + " LEFT OUTER JOIN  universidad AS uni "
                    + " ON uni.id_universidad=c.id_universidad, DOCUMENTOIDENTIFICACION AS d "
                    + " WHERE d.id_documento_identificacion= u.id_documento_identificacion";
            sSQL += " AND  u.nombre  like ? ";
            sSQL += " AND  u.apellidos  like ? ";
            sSQL += " AND  d.id_tipo_documento  like ? ";
            sSQL += " AND  d.numero_documento  like ? ";


            if (idUniversidad != 0) {
                sSQL += " AND uni.id_universidad  = " + idUniversidad;
            }

            if (idCentro != -1) {
                sSQL += " AND  u.id_centro =" + idCentro;

            }

            if (!Utils.isEmpty(perfil)) {
                sSQL += " AND  u.perfil  = " + perfil;
            }

            if (!Utils.isEmpty(estado)) {
                sSQL += " AND  u.estado  =  " + estado;
            }

            if (!Utils.isEmpty(desde)) {
                sSQL += " AND  (u.fecha_alta between  ?  and ? ) ";
            }

            sSQL += " ORDER BY u.nombre ";

            ps = getConnection().prepareStatement(sSQL);

            ps.setString(1, "%" + nombre + "%");
            ps.setString(2, "%" + apellidos + "%");
            ps.setInt(3, tipoDoc);
            ps.setString(4, "%" + numDoc + "%");


            if (!Utils.isEmpty(desde)) {
                ps.setDate(5, new java.sql.Date(sD.parse(desde).getTime()));
                ps.setDate(6, new java.sql.Date(sD.parse(hasta).getTime()));
            }

            rs = ps.executeQuery();
            while (rs.next()) {
                String idUsuario = rs.getString("codigo");
                Usuario usu = new GestorUsuario(conn).getUsuario(idUsuario);
                vV.add(usu);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();

            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorCentro.bbdd") + "\n" + eSQL.getMessage(),
                    UtilLenguaje.getMessage("err.gestorCentro"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();

            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorCentro.generico") + "\n" + eE.getMessage(),
                    UtilLenguaje.getMessage("err.gestorCentro"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return vV;
    }

    public Usuario getUsuario(String idUsuario) throws Exception {

        CentroDocente centroDocente = null;
        DatosBancarios datosBan = null;
        DocumentoIdentificacion docIden = null;
        Contacto contacto;
        ResultSet rs = null;
        PreparedStatement ps = null;
        GestorSubTablas gS = null;
        GestorCentroDocente gC = null;
        Usuario usuario = null;

        try {

            String sSQL = "SELECT nombre, apellidos, sexo, fecha_nacimiento,"
                    + "fecha_alta, contrasena, estado, fecha_estado, motivo_estado,"
                    + "perfil, id_centro, id_documento_identificacion, id_contacto, id_datos_bancarios  ";
            sSQL += " FROM usuario ";
            sSQL += " where codigo =? ";

            ps = getConnection().prepareStatement(sSQL);
            ps.setString(1, idUsuario);

            rs = ps.executeQuery();

            if (rs.next()) {
                String nombre = rs.getString("nombre");
                String apellidos = rs.getString("apellidos");
                String sexo = rs.getString("sexo");
                Date fechaNacimiento = rs.getDate("fecha_nacimiento");
                Date fechaAlta = rs.getDate("fecha_alta");
                String contrasena = rs.getString("contrasena");
                Integer estado = rs.getInt("estado");
                Date fechaEstado = rs.getDate("fecha_estado");
                String motivoEstado = rs.getString("motivo_estado");
                Integer perfil = rs.getInt("perfil");

                Integer idCentro = new Integer(rs.getInt("id_centro"));
                Integer idContacto = new Integer(rs.getInt("id_contacto"));
                Integer idDocIdent = new Integer(rs.getInt("id_documento_identificacion"));
                Integer idDatosBanc = new Integer(rs.getInt("id_datos_bancarios"));


                gS = new GestorSubTablas(getConnection());
                gC = new GestorCentroDocente(getConnection());
                centroDocente = gC.getCentroDocente(idCentro);
                contacto = gS.getContacto(idContacto);
                docIden = gS.getDocIden(idDocIdent);
                // datosBan=new DatosBancarios(idDatosBanc);


                usuario = new Usuario(idUsuario, nombre, apellidos, sexo,
                        fechaNacimiento, fechaAlta, centroDocente,
                        contrasena, docIden, contacto, estado, perfil);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.gestorCentro.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.gestorCentro"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.gestorCentro.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.gestorCentro"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return usuario;
    }

    public void insertarAsistente(Asistente asistent) throws Exception {
        PreparedStatement ps = null;
        ResultSet rs = null;
        Integer idUsuario = null;

        try {
            String sql = "select nextval('seq_usuario')";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            if (rs.next()) {
                idUsuario = new Integer(rs.getInt(1));
            }

            ps.close();

            sql = "INSERT INTO usuario (codigo, nombre, apellidos, sexo, fecha_nacimiento, "
                    + "fecha_alta, contrasena, estado, fecha_estado, motivo_estado, perfil)"//, id_centro, "
                    //+ "id_documento_identificacion, id_contacto, id_datos_bancarios) "
                    + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, idUsuario.toString());
            ps.setString(2, asistent.getNombre());
            //ps.setString(2, asistent.getNombre().getCentroDocente().getIdCentroDocente().intValue());
            ps.setString(3, asistent.getApellidos());
            ps.setString(4, asistent.getSexo());
            ps.setDate(5, (java.sql.Date) asistent.getFechaNacimiento());
            ps.setDate(6, new java.sql.Date(new Date().getTime()));
            ps.setString(7, asistent.getContrasena());
            //ps.setDate(8, (java.sql.Date) asistent.getFechaNacimiento());
            ps.setInt(8, Variables.estadoActivo);
            //ps.setDate(10, new java.sql.Date(asistent.getFechaEstado().getTime()));
            ps.setDate(9, null);
            ps.setString(10, null);
            ps.setInt(11, asistent.getPerfil());
            System.out.println(asistent.getCentroDocente());
            //   ps.setInt(12, null);
            //ps.setInt(14, asistent.getPrecio().intValue());
            // ps.setInt(13, null);
            //ps.setInt(14, null);
            //ps.setInt(15, null);
            ps.executeUpdate();

            conn.commit();
        } catch (SQLException e) {
            conn.rollback();
            throw e;
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
    }
}
